//
//  ZZCHomePictureView.swift
//  weibo
//
//  Created by zhangzuchao on 2017/3/31.
//  Copyright © 2017年 zhangZuChao. All rights reserved.
//

import UIKit
import SDWebImage
 
//  每项的间距
let itemMargin: CGFloat = 5
//  每项的宽度
let itemWidth: CGFloat = (ScreenWidth - 2 * HomeCellMargin - 2 * itemMargin) / 3

//  首页自定义配图
class ZZCHomePictureView: UICollectionView {

    //  懒加载控件
    fileprivate lazy var messageLabel: UILabel = UILabel(fontSize: 20, textColor: UIColor.blue, text: "6")
    
    //  图片数据源
    var picUrls: [ZZCHomePictureInfo]? {
        didSet {
            messageLabel.text = "\(picUrls?.count ?? 0)"
            //  根据图片的个数计算配图的大小
            calcSize(count: picUrls?.count ?? 0)
            
            //  外界设置图片数据源的时候需要重新加载数据
            reloadData()
        }
    }
    
    override init(frame: CGRect, collectionViewLayout layout: UICollectionViewLayout) {
        let flowLayout = UICollectionViewFlowLayout()
        //  设置每项的大小
        flowLayout.itemSize = CGSize(width: itemWidth, height: itemWidth)
        //  设置间距
        flowLayout.minimumLineSpacing = itemMargin
        flowLayout.minimumInteritemSpacing = itemMargin
        super.init(frame: frame, collectionViewLayout: flowLayout)
        setupUI()
    }
    
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    //  添加控件设置约束
    private func setupUI() {
        //  注册cell
        register(ZZCHomePictureViewCell.self, forCellWithReuseIdentifier: HomePictureViewCellIdentifier)
        //  设置数据源代理对象
        dataSource = self
        //  设置代理
        delegate = self
        addSubview(messageLabel)
        
        //隐藏图片个数展示
        messageLabel.isHidden = true
        
        //图片背景色
        backgroundColor = UIColor.init(white: 0.9, alpha: 1)
        messageLabel.snp.makeConstraints { (make) in
            make.center.equalTo(self)
        }
    }
    
    //  根据图片的个数计算当前配图的大小
    fileprivate func calcSize(count: Int) {
        let flowLayout = self.collectionViewLayout as! UICollectionViewFlowLayout
        //  判断是否是单张图片
        if count == 1 {
            //  表示从本地获取下载的单张图片的大小作为配图的大小
            //  获取图片的地址
            let imageUrl = picUrls?.first?.thumbnail_pic
            //  从本地获取下载的图片, key表示下载的图片地址
            if let localImage = SDWebImageManager.shared().imageCache?.imageFromDiskCache(forKey: imageUrl) {
                //  表示本地一定会有这个图片
                
                //  处理单张图片过窄的问题
                var localImageSize = localImage.size
                //  以后产品回去给你相应的数值,根据数值进行计算大小
                if localImageSize.width < 80 {
                    //  指定宽度
                    let currentWidth: CGFloat = 80
                    //  计算后的高度
                    var currentHeight: CGFloat = currentWidth / localImageSize.width * localImageSize.height
                    
                    if currentHeight > 150 {
                        //  如果计算后的图片过长,那么指定其高度
                        currentHeight = 150
                    }
                    //  计算的大小
                    localImageSize = CGSize(width: currentWidth, height: currentHeight)
                }

                //  更新约束
                self.snp.updateConstraints { (make) in
                    make.size.equalTo(localImageSize)
                }
                //  相应的每项cell的大小改成本地图片的大小, 单张图片的配图要和cell的大小保持同步
                flowLayout.itemSize = localImageSize
                
            } else {
                //  本地没有找到,使用默认计算的图片的大小
                //  更新约束
                self.snp.updateConstraints { (make) in
                    make.size.equalTo(CGSize(width: itemWidth, height: itemWidth))
                }
                //  没有找到图片,使用之前计算好的cell的大小
                flowLayout.itemSize = CGSize(width: itemWidth, height: itemWidth)
            }
            return
        }

        //  计算列数
        let cols = count > 3 ? 3 : count
        //  计算行数
        let rows = (count - 1) / 3 + 1
        //  计算当前配图的宽度
        let currentWidth = CGFloat(cols) * itemWidth + CGFloat(cols - 1) * itemMargin
        //  计算当前配图的宽度
        let currentHeight = CGFloat(rows) * itemWidth + CGFloat(rows - 1) * itemMargin
        
        //  把之前写死的尺寸更新一下
        self.snp.updateConstraints { (make) in
            make.size.equalTo(CGSize(width: currentWidth, height: currentHeight))
        }
        
        //  多张图片,每个图片的大小根据之前计算的每个cell的大小是一样的
        flowLayout.itemSize = CGSize(width: itemWidth, height: itemWidth)

    }
    
}

//  MARK: ---UICollectionViewDataSource
extension ZZCHomePictureView: UICollectionViewDataSource, UICollectionViewDelegate, SDPhotoBrowserDelegate {
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return picUrls?.count ?? 0
    }
    
    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: HomePictureViewCellIdentifier, for: indexPath) as! ZZCHomePictureViewCell
        //  获取模型
        let pictureInfo = picUrls![indexPath.item]
        cell.pictureInfo = pictureInfo
        return cell
    }
    //点击cell的方法
    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
        
        let photoBrowser = SDPhotoBrowser()
        photoBrowser.delegate = self
        photoBrowser.currentImageIndex = indexPath.item
        photoBrowser.imageCount = picUrls?.count ?? 0
        photoBrowser.sourceImagesContainerView = self
        photoBrowser.show()
        
    }
    // 返回临时占位图片（即原来的小图）
    
    func photoBrowser(_ browser: SDPhotoBrowser!, placeholderImageFor index: Int) -> UIImage! {
        let cell = self.cellForItem(at: IndexPath(item: index, section: 0)) as! ZZCHomePictureViewCell
        
        return cell.imageView.image
    }
    
    // 返回高质量图片的url
    func photoBrowser(_ browser: SDPhotoBrowser!, highQualityImageURLFor index: Int) -> URL! {
        let urlStr = picUrls![index].thumbnail_pic!.replacingOccurrences(of: "thumbnail", with: "bmiddle")
        return URL(string: urlStr)
    }

}
//  自定义首页配图的cell
class ZZCHomePictureViewCell: UICollectionViewCell {
    
    //  MARK: ---   懒加载控件
    fileprivate lazy var imageView: UIImageView = {
        let imageView = UIImageView(image: UIImage(named: "timeline_image_placeholder"))
        //  使用原始比例显示图片
        imageView.contentMode = .scaleAspectFill
        //  截切超出部分的视图
        imageView.clipsToBounds = true
        return imageView
    }()
    
    //如果有gif图片,给小提示
    fileprivate lazy var gifImageView: UIImageView = UIImageView(image: UIImage(named: "timeline_image_gif"))

    
    //  绑定数据
    var pictureInfo: ZZCHomePictureInfo? {
        didSet {
            //  加载图片
            if let imageUrl = pictureInfo?.thumbnail_pic {
                imageView.sd_setImage(with: URL(string: imageUrl), placeholderImage: UIImage(named: "timeline_image_placeholder"))
                
                //如果有gif图片,给小提示
                if imageUrl.hasSuffix(".gif") {
                    //  gif图片
                    gifImageView.isHidden = false
                } else {
                    //  不是gif图片
                    gifImageView.isHidden = true
                }
                
            }

        }
    }
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        setupUI()
    }
    
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    //  添加控件设置约束
    private func setupUI() {
        contentView.addSubview(imageView)
        contentView.addSubview(gifImageView)
        imageView.snp.makeConstraints { (make) in
            make.edges.equalTo(contentView)
        }
        gifImageView.snp.makeConstraints { (make) in
            make.bottom.equalTo(imageView)
            make.trailing.equalTo(imageView)
        }
    }
}

